到了第 16 天,你的專案已經不再只是幾個小元件的組合了。
隨著功能越來越多,如果程式碼還是「隨手放哪就放哪」,很快就會遇到兩個問題:
今天我們的目標,就是要學會 專案結構化管理,並讓 Cursor 幫我們把程式碼「整理乾淨」。
想像一下,你的專案目錄長這樣:
pages/
components/
utils/
一開始很單純,但隨著專案變大,會變成:
components/
裡塞了 30 個檔案,找不到誰是誰utils/
裡一堆 function,名字又模糊pages/
裡面還藏著一堆邏輯這就是傳說中的「巨石程式(Monolith Code)」,看起來堆得很整齊,其實是地雷區。
比較推薦的方式,是依照「功能(feature)」來切分:
src/
├─ features/
│ ├─ auth/
│ │ ├─ components/
│ │ ├─ hooks/
│ │ └─ services/
│ ├─ posts/
│ │ ├─ components/
│ │ ├─ hooks/
│ │ └─ services/
├─ shared/
│ ├─ components/
│ └─ utils/
features/
:依功能(登入、文章、購物車…)分開shared/
:共用資源(按鈕、Card、工具函式)services/
:通常放 API 呼叫或商業邏輯hooks/
:自定義 React hooks,避免邏輯重複這樣的結構有幾個優點:
你不需要一個檔案一個檔案慢慢搬。
Cursor 可以幫你做到這件事:
把 components 裡的 LoginForm 移動到 features/auth/components/
並更新所有 import 路徑
它會:
這比你手動整理快得多,還能避免路徑錯誤。
除了「資料夾結構」,你還需要控制「檔案大小」。
常見問題:
index.tsx
裡面塞了 UI + API 呼叫 + 狀態管理
👉 建議:
拆檔案
components/
services/
hooks/
抽共用邏輯
例如:
// hooks/useAuth.ts
import { useState } from "react"
import { login } from "@/features/auth/services/api"
export function useAuth() {
const [user, setUser] = useState(null)
async function signIn(email: string, password: string) {
const res = await login(email, password)
setUser(res.user)
}
return { user, signIn }
}
在頁面中呼叫:
const { user, signIn } = useAuth()
這樣就能避免把所有邏輯都塞進頁面裡。
你可以直接對 Cursor 說:
把這個頁面的 API 呼叫抽出去,放到 services/api.ts
或是:
這個檔案太長了,幫我把表單部分抽成一個獨立元件
它會自動:
這就是 AI 協助「程式碼清理」的最佳時機。
昨天我們提過:Build 成功就 Commit。
今天再加一個新習慣:
重構完成後,一定要 Commit!
因為重構很容易出錯,
有時候 Cursor 幫你搬檔案,但你沒注意就多了一個錯誤。
這時候能回到「上一個乾淨版本」會非常重要。
範例:
git add .
git commit -m "Day 16: 專案結構化,整理 auth / posts 模組"
今天我們學會了: